package objetos.aeronaves.enemigos;

import juego.Escenario;
import movimiento.Posicion;
import movimiento.patrones.Aleatorio;
import objetos.*;
import objetos.aeronaves.*;
import objetos.armas.CuartoArmas;
import org.jdom.*;
import vistas.FactoryVistas;
import ar.uba.fi.algo3.titiritero.ControladorJuego;
import ar.uba.fi.algo3.titiritero.vista.Imagen;
import auxiliares.Vector;

/*
 * Clase que modela al avi�n gu�a
 */
public class AvionGuia extends Enemigo {

	public AvionGuia() {
		super();
		this.setTamanio(60);
		this.setEnergia(new Energia(1500));
		this.setVelocidad(new Vector(0, 2));
		this.setPatron(new Aleatorio());
		this.setPuntajeOtorgado(100);
		this.setVelocidadHuida(new Vector(0, -2));
		this.getArsenal().activarLaser();
		this.getArsenal().cargarTorpedos(10);
		this.getArsenal().cargarRastreadores(5);
		this.getArsenal().cargarCohetes(5);
	}

	public AvionGuia(int x, int y) {
		this();
		this.setPosicion(new Posicion(x, y));
	}

	@Override
	public void retornarAlCombate() {
		/* El avi�n gu�a nunca deja el escenario */
		int y = this.getPosicion().getEnY();
		int maxY = Escenario.getInstance().getMaxY();
		if (y < 0 || y > maxY - 50) {
			int velocidadY = this.getVelocidad().getComponenteY();
			this.getVelocidad().setComponenteY(velocidadY * -1);

			setChanged();
			notifyObservers();
		}
	}

	@Override
	public Imagen darVista(ControladorJuego controlador) {
		return FactoryVistas.crearVista(this, controlador);
	}

	@Override
	public void destruir() {
		/* Si se destruye el avi�n gu�a se termina el nivel */
		if (this.estaDestruido()) {
			return;
		}
		super.destruir();
		Escenario.getInstance().finNivel();
	}

	@Override
	public void colisionConAlgo42(Algo42 algo42) {
		/* El avi�n gu�a no se destruye autom�ticamente al chocar con el Algo42 */
		this.recibirDanio(new Danio(algo42.getCantidadEnergia()));
		algo42.recibirDanio(new Danio(this.getEnergia().getCantidad()));
		algo42.modificarPuntaje(this.getPuntajeOtorgado());
	}

	/* Persistencia */
	public AvionGuia(Element nodo) {
		this(Integer.parseInt(nodo.getAttributeValue("posicionX")), Integer
				.parseInt(nodo.getAttributeValue("posicionY")));
		this.setArsenal(new CuartoArmas(nodo.getChild("cuartoArmas")));
		this.getArsenal().setBase(this);
	}

	/* NodoXML a partir de instancia */
	@Override
	public Element obtenerNodo() {
		Element nodo = new Element("avionGuia");
		nodo.setAttribute(new Attribute("posicionX", Integer.toString(this
				.getPosicion().getEnX())));
		nodo.setAttribute(new Attribute("posicionY", Integer.toString(this
				.getPosicion().getEnY())));
		nodo.addContent(this.getArsenal().obtenerNodo());
		return nodo;
	}

}
